Skip to content

feat/phase-6-settings: editable settings + Velopack updater (stacked on #8)#9

Merged
StuartMeeks merged 3 commits into
masterfrom
feat/phase-6-settings
May 29, 2026
Merged

feat/phase-6-settings: editable settings + Velopack updater (stacked on #8)#9
StuartMeeks merged 3 commits into
masterfrom
feat/phase-6-settings

Conversation

@StuartMeeks

Copy link
Copy Markdown
Owner

Phase 6 — the last in the stack. Settings becomes interactive and the Velopack updater wakes up.

Base: `feat/phase-5-platform` (PR #8). Once the stack merges, please retarget this PR to `master` and rebase.

What's live

  • Theme — System / Light / Dark, applies the moment you change the combo (no save button).
  • Close behaviour — Hide-to-tray (default) or Exit on close. Persists immediately to `AppConfig`.
  • Hotkey — shown as formatted text (e.g. `Ctrl+Alt+S`). Rebinding is a follow-up.
  • Storage location — read-only display of the active path. Move/adopt support is a follow-up.
  • Updates — "Check for updates" hits the GitHub releases for `StuartMeeks/Snipdeck` via Velopack. "Apply & restart" appears only when an update is available. Dev builds gracefully no-op (`UpdateManager.IsInstalled` gate).
  • About — app name, version (from `InformationalVersion`), copyright (from `Directory.Build.props`).

New abstractions

  • `IThemeApplier` — Core hands off the WinUI side to apply `ElementTheme`.
  • `IUpdateService` — `CheckForUpdatesAsync()` / `ApplyUpdateAndRestartAsync()`.

New App services

  • `WindowsThemeApplier` — sets `RequestedTheme` on `MainWindow.Content`.
  • `WindowsUpdateService` — Velopack `UpdateManager(new GithubSource(...))` with try/catch fences.

Tests

106 Core tests still passing. New test doubles for the new abstractions:
`FakeThemeApplier`, `FakeUpdateService`, `FakePathProvider`, `FakeSettingsStore`.

Deferred (parked in TODO.md or follow-up)

  • Storage path move/adopt UI
  • Hotkey rebinding UI (needs a key capture control)
  • Backup retention configurable
  • Nerdbank.GitVersioning for a git-tag-derived version string

What CI doesn't verify (please test)

  • Theme combo changes the window's chrome / Mica appearance immediately
  • Close behaviour combo flips between hide-to-tray and full exit on the very next close
  • "Check for updates" surfaces something sensible (whether or not an update is actually available)
  • About expander shows a real version string

🤖 Generated with Claude Code

StuartMeeks and others added 3 commits May 29, 2026 17:57
Settings page becomes interactive:
  - Theme combo (System/Light/Dark) applies live via IThemeApplier ->
    MainWindow.Content.RequestedTheme.
  - Close behaviour combo (Hide-to-tray vs Exit) persists immediately.
  - Hotkey + storage location shown read-only with a note about future
    rebind / move support.

About expander reads real assembly metadata (InformationalVersion,
copyright) from Directory.Build.props.

WindowsUpdateService wraps Velopack's UpdateManager pointed at the
StuartMeeks/Snipdeck GitHub releases. Check button surfaces the available
version; Apply button (visible only when an update is available) downloads
and restarts. Dev builds gracefully no-op via UpdateManager.IsInstalled.

ShellViewModel.OpenSettings now takes a SettingsViewModel parameter —
ShellPage code-behind resolves it from DI on each click so the page reads
fresh config state.

New abstractions: IThemeApplier, IUpdateService.
New App services: WindowsThemeApplier, WindowsUpdateService.

This PR is the fourth and last in the stack. Base: feat/phase-5-platform.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…ne the null check

CA2016: pass cancellationToken through to Velopack's DownloadUpdatesAsync via
its cancelToken named parameter.

IDE0046: fold the trailing null check into a single ternary return so the
analyser stops asking for it.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The Phase 4-6 PRs trimmed several items to stay reviewable. Capture them
here with enough detail to pick up cold: hotkey rebinding UI, storage path
move/adopt/conflict flow, configurable backup retention, CLI delete cascade
decision, NBGV integration, markdown rendering for descriptions, trash UI.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Base automatically changed from feat/phase-5-platform to master May 29, 2026 22:49
@StuartMeeks StuartMeeks merged commit 6dd4b22 into master May 29, 2026
2 checks passed
@StuartMeeks StuartMeeks deleted the feat/phase-6-settings branch May 29, 2026 22:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant